package kisti.module.database;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import kisti.module.log.Glog;

import org.w3c.dom.Document;
import org.w3c.dom.Element;


/**
 * 
 * <pre>
 * kisti.module.database
 *   |_ ConnectToKissmanDB.java
 *
 * </pre>
 *
 * Desc : KissmanDB 접속하는 모듈. 
 * CDF Grid job 들이 들어있는 kissman 데이터베이스에 연결하여 
 * 클라이언트의 요청에 따른 해당 정보를 데이터베이스로부터 가져와서 
 * 해당 클라이언트에 XML 형식으로 변환하여 보내준다. 
 * @Company : KISTI
 * @Author : daniel
 * @Date   : 2011. 11. 14. 오후 5:46:20
 * @Version: V1
 *
 */
public class ConnectToKissmanDB {

	private static final String ipAddressForDatabase  = "150.183.234.168";
	private static final String dbName = "kissman";
	private static final String dbUser = "kissman";
	private static final String dbPass = "kissman";
	private static final String url= "jdbc:mysql://"+ ipAddressForDatabase +":3306/kissman";
	private Connection conn ;
	private Statement stmt;
	private String selectQuery;
	private String resultTuple;
	
	
	/**
	 * 
	 * Desc : 
	 * @Method Name : ConnectToKissManDB
	 *
	 */	
	public void KissManDatabase() {
		// TODO Auto-generated constructor stub
	}
	
	
	
	
	
	
	
	
	/**
	 * 
	 * Desc : 데이터베이스 연결하느 함수로써, kissman db에 연결을 하고 
	 * 연결후에 statement 를 반환한다. 
	 * @Method Name : OpenDatabase
	 * @return
	 *
	 */
	private  Statement OpenDatabase(){
		try {		
			Glog.Log(Glog.LOG_COMMON,"ConnectToKissmanDB" ,"---------- OpenDatabase  ------------ ");
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection( url, dbUser, dbPass);
			stmt = conn.createStatement();
		} catch (Exception e) {
			// TODO: handle exception
			Glog.Log(Glog.LOG_ERROR,"ConnectToKissmanDB" , e.toString());
		}	
		return stmt;
	}
	
	/**
	 * 
	 * Desc : 데이터베이스와 연결된 커넥션과 Statement 를 닫아  연결을 종료한다. 
	 * @Method Name : CloseDatabase
	 *
	 */
	private void CloseDatabase(){
		try {
			Glog.Log(Glog.LOG_COMMON, "ConnectToKissmanDB",
					"---------- CloseDatabase  ------------ ");
			conn.close();
			stmt.close();
		} catch (Exception e) {
			// TODO: handle exception
			Glog.Log(Glog.LOG_ERROR,"ConnectToKissmanDB" , e.toString());
		}
	}
	
	/**
	 * 
	 * Desc : TierServer에서의 요청을 받는다. 
	 * TierServe와 연결은 이 매소드로만 한다. 
	 * @Method Name : requestDataToDataBase
	 * @param requestType 현재 사용하지 않는다. 
	 * @return 데이터베이스에서 가져온 튜플들을 XML형식으로 변환하여  스트링 형식으로 반환한다. 
	 *
	 */
	public Object requestDataToDataBase(String requestType){
		//요청한 서비스 선택하여 해당 펑션 호출
		Object obj = null;		
			obj = retrieveCDFJob();		
		return obj ;
	}
	
	
	
	/**
	 * 	 
	 * Desc : 데이터베이스에 있는 CDF Job 데이터를 가져오고, 각 축출한 튜플을
	 * 각 attribute 에 따라 XML 형식으로 만들고 반환한다. 
	 * @Method Name : retriveCDFJob
	 * @return CDF Job 데이터를 XML 형식의 String으로 반환
	 *
	 */
	private Object retrieveCDFJob() {
		Object obj = null;
		Statement stmt = OpenDatabase();
		String selectQuery = "select * from cdf_job_month_new";
		

		try {
			ResultSet rs = stmt.executeQuery(selectQuery);

			/**
			 * XML 생성
			 */
			Glog.Log(Glog.LOG_COMMON, "ConnectToKissmanDB", "디비에서 튜플 가져와서 XML로 생성 시작...  ");
			DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

			// root element
			Document doc = docBuilder.newDocument();
			Element rootElement = doc.createElement("Data");
			doc.appendChild(rootElement);

			while (rs.next()) {

				Element node = doc.createElement("Node");
				rootElement.appendChild(node);

				Element month = doc.createElement("month");
				month.appendChild(doc.createTextNode(rs.getString(1)));
				node.appendChild(month);
				Element period1 = doc.createElement("period1");
				period1.appendChild(doc.createTextNode(rs.getString(2)));
				node.appendChild(period1);
				Element period2 = doc.createElement("period2");
				period2.appendChild(doc.createTextNode(rs.getString(3)));
				node.appendChild(period2);
				Element user = doc.createElement("user");
				user.appendChild(doc.createTextNode(rs.getString(4)));
				node.appendChild(user);
				Element jobTotal = doc.createElement("jobTotal");
				jobTotal.appendChild(doc.createTextNode(rs.getString(5)));
				node.appendChild(jobTotal);
				Element sucessJob = doc.createElement("sucessJob");
				sucessJob.appendChild(doc.createTextNode(rs.getString(6)));
				node.appendChild(sucessJob);
				Element ratioSucessJob = doc.createElement("ratioSucessJob");
				ratioSucessJob.appendChild(doc.createTextNode(rs.getString(7)));
				node.appendChild(ratioSucessJob);				
				Element totalWallTime = doc.createElement("totalWallTime");				
				totalWallTime.appendChild(doc.createTextNode(rs.getString(8)));
				node.appendChild(totalWallTime);				
				Element successWallTime = doc.createElement("successWallTime");				
				successWallTime.appendChild(doc.createTextNode(rs.getString(9)));				
				node.appendChild(successWallTime);				
				Element ratioSucessWallTime = doc.createElement("ratioSucessWallTime");				
				ratioSucessWallTime.appendChild(doc.createTextNode(rs.getString(10)));
				node.appendChild(ratioSucessWallTime);				
				Element status = doc.createElement("status");
				status.appendChild(doc.createTextNode(rs.getString(11)));
				node.appendChild(status);
			}

			
			/**
			 * XML 파일로 쓰기
			 */
			Glog.Log(Glog.LOG_COMMON, "ConnectToKissmanDB",
					"생성된 XML데이터 파일로 쓰기  ");
			TransformerFactory transformerFactory = TransformerFactory
					.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			transformer.setOutputProperty(OutputKeys.INDENT, "No");
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(new FileOutputStream(
					new File("cdfJobs.xml")));
			// 파일로 쓰지 않고 콘솔에 찍어보고 싶을 경우 다음을 사용+ (디버깅용)
			// StreamResult result = new StreamResult(System.out);
			transformer.transform(source, result);
			Glog.Log(Glog.LOG_COMMON, "ConnectToKissmanDB",
					"생성된 XML데이터 파일로 쓰기 완료!  ");

			/**
			 * String 으로 축출...
			 */
			Glog.Log(Glog.LOG_COMMON, "ConnectToKissmanDB",
					"XML 데이터 스트림으로 생성 ....  ");
			File xmlFile = new File("cdfJobs.xml");
			BufferedReader br = new BufferedReader(new InputStreamReader(
					new FileInputStream(xmlFile.getPath())));
			String xmlString = "";
			String str = "";
			while ((str = br.readLine()) != null) {
				xmlString += str;
			}

			obj = xmlString;
			br.close();

		} catch (Exception e) {
			// TODO: handle exception
			Glog.Log(Glog.LOG_ERROR, "ConnectToKissmanDB", e.toString());
		} finally {
			CloseDatabase();
		}
		return obj;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	/**
	 * 
	 * Desc :
	 * @Method Name : main
	 * @param args
	 *
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ConnectToKissmanDB c = new ConnectToKissmanDB();
		c.retrieveCDFJob();
//		c.requestDataToDataBase("jobGraph");
//		c.requestDataToDataBase("jobsubmition");
	}
}





